package com.sjgl.esdn.mapper;

import com.sjgl.esdn.domain.entity.TempBlog;
import com.sjgl.esdn.domain.entity.File;
import com.sjgl.esdn.domain.entity.User;
import com.sjgl.esdn.domain.entity.uc.UCFile;
import com.sjgl.esdn.domain.entity.vo.HotFileVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * 文件 数据层
 *
 * @author Administrator
 * @date 2022/08/05
 */
@Mapper
@Repository
@Component
public interface FileMapper {

    /**
     * 插入文件
     *
     * @param file 文件
     * @return int
     */
    public int insertFile(File file);

    /**
     * 插入博客
     * @param file
     * @return
     */
    public int insertBlog(File file);

    /**
     * 修改文件
     *
     * @param file 文件
     * @return int
     */
    public int updateFile(File file);

    /**
     * 删除文件(伪删除)
     *
     * @param fileId 文件id
     * @param userId 用户id
     * @param reason 原因
     * @return int
     */
    public int deleteFile(@Param("fileId") Long fileId, @Param("userId") Long userId, @Param("reason") String reason);

    /**
     * 下载文件（文件下载表新增）
     *
     * @param fileId 文件标识
     * @param userId 用户id
     * @return int
     */
    public int downloadFile1(@Param("fileId") Long fileId, @Param("userId") Long userId);

    /**
     * 下载文件（文件下载表修改）
     *
     * @param fileId 文件标识
     * @param userId 用户id
     * @return int
     */
    public int downloadFile2(@Param("fileId") Long fileId, @Param("userId") Long userId);

    /**
     * 下载文件（下载量增加）
     *
     * @param fileId 文件标识
     * @return int
     */
    public int downloadNumAdd(@Param("fileId") Long fileId);

    /**
     * 收藏文件（收藏量增加）
     *
     * @param fileId 文件id
     * @return int
     */
    public int collectionNumAdd(@Param("fileId") Long fileId);

    /**
     * 浏览文件（文件浏览表新增）
     *
     * @param fileId 文件标识
     * @param userId 用户id
     * @return int
     */
    public int browseFile1(@Param("fileId") Long fileId, @Param("userId") Long userId);

    /**
     * 浏览文件（文件浏览表修改）
     *
     * @param fileId 文件标识
     * @param userId 用户id
     * @return int
     */
    public int browseFile2(@Param("fileId") Long fileId, @Param("userId") Long userId);

    /**
     * 浏览文件（浏览量增加）
     *
     * @param fileId 文件id
     * @return int
     */
    public int browseNumAdd(@Param("fileId") Long fileId);

    /**
     * 选择存储文件夹
     *
     * @param fileSuffix 后缀
     * @return {@link String}
     */
    public String selectFolder(String fileSuffix);

    /**
     * 文件、部门关联
     *
     * @param fileId 文件id
     * @param deptId 部门id
     * @return int
     */
    public int insertFileDept(@Param("fileId") Long fileId, @Param("deptId") Long deptId);

    /**
     * 删除文件部门关联
     *
     * @param fileId 文件id
     * @return int
     */
    public int deleteFileDept(@Param("fileId") Long fileId);

    /**
     * 通过文件id得到支持的部门id列表
     *
     * @param fileId 文件标识
     * @return {@link List}<{@link Long}>
     */
    public List<Long> getDeptIdList(@Param("fileId") Long fileId);

    /**
     * 通过文件id得到创建者
     *
     * @param fileId 文件id
     * @return {@link Long}
     */
    public Long getCreateByByFileId(@Param("fileId") Long fileId);

    /**
     * 检查文件是否唯一
     *
     * @param fileId 文件标识
     * @return int
     */
    public int checkFileUnique(@Param("fileId") Long fileId);

    /**
     * 判断用户是否下载过文件
     *
     * @param userId 用户id
     * @param fileId 文件标识
     * @return boolean
     */
    public int hasUserDownloadFile(@Param("userId") Long userId, @Param("fileId") Long fileId);

    /**
     * 判断用户是否浏览过文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return boolean
     */
    public int hasUserBrowseFile(@Param("userId") Long userId, @Param("fileId") Long fileId);

    /**
     * 通过文件ID查询文件
     *
     * @param fileId 文件标识
     * @return {@link User}
     */
    public File selectFileById(@Param("fileId") Long fileId);

    /**
     * 获得上传文件列表通过用户id
     *
     * @param userId 用户id
     * @return {@link List}<{@link File}>
     */
    public List<File> getUploadFileListByUserId(@Param("userId") Long userId);

    /**
     * 是否用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return int
     */
    public int isUserLikeFile(@Param("userId") Long userId, @Param("fileId") Long fileId);

    /**
     * 删除用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return int
     */
    public int deleteUserLikeFile(@Param("userId") Long userId, @Param("fileId") Long fileId);

    /**
     * 添加用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return int
     */
    public int addUserLikeFile(@Param("userId") Long userId, @Param("fileId") Long fileId);

    /**
     * 点赞量减少
     *
     * @param fileId 文件id
     * @return int
     */
    public int likeNumDec(@Param("fileId") Long fileId);

    /**
     * 点赞量增加
     *
     * @param fileId 文件id
     * @return int
     */
    public int likeNumAdd(@Param("fileId") Long fileId);

    /**
     * 获取该用户创建的文件集合
     *
     * @param UserId 用户id
     * @return {@link List}<{@link File}>
     */
    List<File> selectByCreateBy(Long UserId);

    /**
     * 获取文件名称通过文件id
     *
     * @param fileId 文件标识
     * @return {@link String}
     */
    String selectFileNameByFileId(Long fileId);

    /**
     * 选择文件后缀 通过文件id
     *
     * @param fileId 文件标识
     * @return {@link String}
     */
    String selectFileSuffixByFileId(Long fileId);

    /**
     * 获取文件类通过文件id
     *
     * @param fileId 文件标识
     * @return {@link List}<{@link File}>
     */
    UCFile selectByFileId(@Param("fileId") Long fileId);

    String[] selectFileLabelByFileId(@Param("fileId") Long fileId);

    String selectColumnByFileId(@Param("fileId") Long fileId);

    String selectAuthorByFileId(@Param("fileId") Long fileId);

    Long selectAuthorIdByFileId(@Param("fileId") Long fileId);

    Date selectDownloadTimeById(@Param("fileId") Long fileId,@Param("userId") Long userId);

    Date selectCreateTimeByFileId(@Param("fileId") Long fileId);

    void updateUploadFile(@Param("fileId") Long fileId,@Param("flag") Integer flag);

    Integer selectIsBlogByFileId(@Param("fileId") Long fileId);

    Integer selectFileTypeByFileIdInteger(@Param("fileId") Long fileId);

    Long[] selectFileIdByuserId(@Param("userId") Long userId);

    String selectFileIntroByFileId(@Param("fileId") Long fileId);

    Long selectBrowseNumByFileId(@Param("fileId") Long fileId);

    Long selectLikeNumByFileId(@Param("fileId") Long fileId);

    Long selectCommentNumByFileId(@Param("fileId") Long fileId);

    Long selectBoxNumByFileId(@Param("fileId") Long fileId);

    List<File> getUnpublishedBlogs(@Param("userId") Long userId);


    /**
     * 保存临时博客
     *
     * @param tempBlog 临时博客
     * @return int
     */
    int saveTempBlog(@Param("tempBlog") TempBlog tempBlog);

    /**
     * 更新临时博客
     * 保存临时博客
     *
     * @param tempBlog 临时博客
     * @return int
     */
    int updateTempBlog(@Param("tempBlog") TempBlog tempBlog);

    /**
     * 获得临时博客列表
     *
     * @param userId 用户id
     * @return {@code List<File>}
     */
    List<TempBlog> getTempBlogList(@Param("userId") Long userId);

    /**
     * 插入文件标签
     *
     * @param fileId  文件标识
     * @param labelId 标签id
     * @return int
     */
    int insertFileLabel(@Param("fileId") Long fileId, @Param("labelId") Long labelId);

    /**
     * 插入文件专栏
     *
     * @param fileId   文件标识
     * @param columnId 专栏id
     * @return int
     */
    int insertFileColumn(@Param("fileId") Long fileId, @Param("columnId") Long columnId);

    /**
     * 删除临时博客
     *
     * @param tempBlogId 临时博客id
     * @return int
     */
    int deleteTempBlog(@Param("tempBlogId") Long tempBlogId);

    /**
     * 获得热点文件列表1
     *
     * @param limit 限制
     * @return {@code List<HotFileVo>}
     */
    List<HotFileVo> getHotFileList1(@Param("limit") Long limit);

    /**
     * 变热id文件
     *
     * @param fileId 文件标识
     * @return {@code HotFileVo}
     */
    HotFileVo getHotFileById(@Param("fileId") Long fileId);

    /**
     * 得到最近下载文件列表
     *
     * @param days 天
     * @return {@code File}
     */
    List<File> getRecentDownloadFileList(@Param("days") Long days);
}
